package com.hspedu.innerClass.category;

/**
 * 匿名内部类细节
 * 匿名内部类必须继承一个父类或实现一个接口
 * 常用于多线程实现，因为多线程必须继承Thread类或是Runnable接口
 */
public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        new Outer05().f1();
    }
}

class Outer05 {
    private int n1 = 99;

    public void f1() {
        //创建一个基于类的匿名内部类
        //不能添加访问修饰符，因为它的地位就是一个局部变量
        //作用域：仅仅在定义它的方法或代码块中
        new Person() {
            @Override
            public void hi() {
                super.hi();
            }

            @Override
            public void ok(String str) {
                System.out.println("匿名内部类重写了ok方法");
            }
        }.ok("jack");//可以像匿名对象一样调用


        Person p = new Person() {
            private int n1 = 88;

            @Override
            public void hi() {
                //可以直接访问外部类的所有成员，包含私有的
                //如果外部类和匿名内部类的成员重名时，匿名内部类访问的话，
                //默认遵循就近原则，如果想访问外部类的成员，则可以使用 （外部类名.this.成员）
                System.out.println("匿名内部类重写了 hi方法 n1=" + n1 +
                        " 外部内的n1=" + Outer05.this.n1);
            }
        };
        p.hi();//动态绑定，运行类型是
        System.out.println("内部类对象p的运行类型是："+ p.getClass());
    }
}

class Person {
    public void hi() {
        System.out.println("Person hi()");
    }

    public void ok(String str) {
        System.out.println("Person ok()" + str);
    }
}